<?php
	class CriarEntity {
	    /**
	     * Enter description here...
	     *
	     * @param Tabela $objTabela
	     * @return String
	     */
		public static function execute($objTabela) {
                    $t = '    ';
		    /*Primeiro caracter em maiusculo, como manda a convencao.*/
		    $tabela = Util::nomeDbToClasse(strtolower($objTabela->getNomeTabela()));

		    /*Iniciando a criacao do conteudo do arquivo*/
		    $conteudo = '<?php'  . "\n";
		    $conteudo .= "$t" . 'require_once ROOT . \'server/classes/arquitetura/entity/AbstractEntity.class.php\';' . "\n\n";
		    $conteudo .= "$t" . 'class ' . $tabela . " extends AbstractEntity {\n";

		    $matInteiros = array('tinyint', 'smallint', 'mediumint', 'int', 'integer', 'bigint', 'float', 'double', 'double precision', 'real', 'numeric');
		    
		    for($i = 0; $i < count($objTabela->getCampos()); $i++) {
		    	/*Criando os atributos, setters e getters*/
	    		/*Atribuicao colocada aqui pq pode haver um campo data_db que entra no insert*/
	    		$nomeCampos[] = $objTabela->getCampo($i);
	    		if ($objTabela->getCampo($i) != 'ativo') {
	    		    $conteudo .= "$t$t" . 'private $' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ";\n";
	    		}
		    }
		    
		    $conteudo .= "\n$t$t" . '/**' . "\n$t$t * Default Constructor.\n$t$t */\n$t$t" . 'public function __construct() {' . "\n$t$t}\n";

		    for($i = 0; $i < count($objTabela->getCampos()); $i++) {
		    	/*Criando os atributos, setters e getters*/
	    		/*Atribuicao colocada aqui pq pode haver um campo data_db que entra no insert*/
	    		$nomeCampos[] = $objTabela->getCampo($i);
	    		if ($objTabela->getCampo($i) != 'ativo')
	    		{
					$conteudo  .= "\n$t$t" . '/* Este atributo eh ' . $objTabela->getTipo($i) . ' */' . "\n$t$t" . 'public function set' . Util::nomeDbToClasse($objTabela->getCampo($i)) . '($' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ") {\n$t$t$t";

					$conteudo  .= '$this->' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ' = $' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ";\n$t$t}\n";

					$conteudo  .= "\n$t$t" . 'public function get' . Util::nomeDbToClasse($objTabela->getCampo($i)) . "() {\n$t$t$t" . 'return $this->' . Util::nomeDbToAtributo($objTabela->getCampo($i)) . ";\n$t$t}\n";

					$valores[] = '$' . Util::nomeDbToAtributo($objTabela->getCampo($i));		    			
	    		}
			}

			/*Inserindo o comando para data do banco, de acordo com o banco usado, no campo data_db.*/
			if (in_array('insert_date', $nomeCampos)) {
				switch ($GLOBALS['banco'])
				{
					case 'mssql':
						$dataBanco = 'getdate()';
						break;
					case 'mysql':
						$dataBanco = 'now()';
						break;
					case 'pq':
						$dataBanco = '';
						break;
				}
				$valores[] = "'" . $dataBanco . "'";
			}
			
			/* Create the method __toString() */
			$conteudo .= "\n$t$t" . 'public function __toString() {' . "\n";
			$conteudo .= "$t$t$t" . 'return $this->get' . Util::nomeDbToClasse($objTabela->getCampo(1)) . "();\n";//Posicao 1 vem logo apos o id
			$conteudo .= "$t$t}\n";
			
			/* Create the method equals() */
			$conteudo .= "\n$t$t" . 'public function equals($obj) {' . "\n";
			$conteudo .= "$t$t$t" . 'if(empty($obj)) {' . "\n$t$t$t$t" . 'return false;' . "\n$t$t$t}\n";
			$conteudo .= "$t$t$t" . 'if(';
			
			$iniEquals = false;
			for($i = 0; $i < count($objTabela->getCampos()); $i++) {
				if ($objTabela->getCampo($i) != 'insert_date' && $objTabela->getCampo($i) != 'ativo' && $objTabela->getCampo($i) != 'update_date'){
                                        if($iniEquals) {
                                            $conteudo .= ' && ';
                                        }
                                        $nomeMetodoGet = Util::nomeDbToClasse($objTabela->getCampo($i));
                                        $conteudo .= '$this->get' . $nomeMetodoGet . '() == $obj->get' . $nomeMetodoGet . '()';
                                        $iniEquals = true;
				}
			}
			
			$conteudo .= ") {\n$t$t$t$t" . 'return true;' . "\n$t$t$t}\n$t$t    return false;\n$t$t}\n";
			
			$conteudo .= "\n$t$t" . 'public function cloneMe() {' . "\n$t$t$t" . '$new' . $tabela . ' = new ' . $tabela . '();' . "\n";
			for($i = 0; $i < count($objTabela->getCampos()); $i++) {
				if ($objTabela->getCampo($i) != 'ativo') {
					$nomeMetodoSet = Util::nomeDbToClasse($objTabela->getCampo($i));
					$conteudo .= "$t$t$t" . '$new' . $tabela . '->set' . $nomeMetodoSet . '($this->get' . $nomeMetodoSet . '());' . "\n";
				}
			}
			$conteudo .= "$t$t$t" . 'return $new' . $tabela . ";\n$t$t}\n";

		    $ultimaLinha = "$t}\n?>\n";
		    $conteudo .= $ultimaLinha;

		    return $conteudo;
		}
	}
?>